module.exports = function(grunt) {
 
  // LiveReload的默认端口号，你也可以改成你想要的端口号
  var lrPort = 9001;
  // 使用connect-livereload模块，生成一个与LiveReload脚本
  var lrSnippet = require('connect-livereload')({
		port: lrPort
  });
  
	// 用静态服务器
	var serveStatic = require('serve-static');
	var serveIndex = require('serve-index');
	var lrMiddleware = function(connect, options, middlwares) {
		return [
			lrSnippet,
			serveStatic(options.base[0]),
			serveIndex(options.base[0])
		];
	};
    grunt.loadNpmTasks('grunt-replace');
  // 任务配置
  grunt.initConfig({

    pkg: grunt.file.readJSON('package.json'),

    //合并js文件  
    concat: {  
      options: {  
        stripBanners:true, 
        banner:'/*!<%= pkg.name %> - <%= pkg.version %>-'+'<%=grunt.template.today("yyyy-mm-dd") %> */\n'
      }, 
      cssConcat:{
        src:['src/**/*.css'],
        dest:'dist/concat/<%= pkg.name %> - <%= pkg.version %>.css' 
      },
      jsConcat:{
          src:'src/**/*.js',
          dest:'dist/concat/<%=pkg.name %> - <%= pkg.version %>.js'
      } 
    },  
    // 通过connect任务，创建一个静态服务器
    connect: {
      options: {
        // 服务器端口号
        port: 8000,
        // 服务器地址(可以使用主机名localhost，也能使用IP)
        hostname: 'localhost',
        // 物理路径(默认为. 即根目录) 注：使用'.'或'..'为路径的时，可能会返回403 Forbidden. 此时将该值改为相对路径 如：/grunt/reloard。
        base: ['src'],
        open: {target:'http://localhost:8000', appName: 'chrome'}
      },
      livereload: {
        options: {
          // 通过LiveReload脚本，让页面重新加载。
          middleware: lrMiddleware
        }
      }
    },
    //压缩css
    cssmin:{
      options:{
          stripBanners:true, 
          banner:'/*!<%= pkg.name %> - <%= pkg.version %>-'+'<%=grunt.template.today("yyyy-mm-dd") %> */\n'
      },
      build:{
          src:'dist/concat/<%=pkg.name %> - <%=pkg.version %>.css',
          dest:'dist/build/<%= pkg.name %> - <%= pkg.version %>.min.css' 
      }
    },
    //压缩js文件  
    uglify: {  
      options:{
        stripBanners:true, //合并时允许输出头部信息
        banner:'/*!<%= pkg.name %> - <%= pkg.version %>-'+'<%=grunt.template.today("yyyy-mm-dd") %> */\n'
      },
      build:{
          src:'dist/concat/<%=pkg.name %> - <%=pkg.version %>.js',
          dest:'dist/build/<%= pkg.name %> - <%= pkg.version %>.min.js' 
      }  
     },  
    //检查css代码规范  
    csslint:{
      //目前只定义了基本CSS规则
      options:{
        "box-model" : false,        　　　　　 //设置width或height的同时，还设置为border或padding，则必须设置box-sizing
        "display-property-grouping": false,   //设置display属性时，不能包含其他不必要的代码，如display:inline，又设置height值
        "duplicate-properties" : false,    　 //不允许包含重复的样式属性
        "empty-rules" : false,           　　 //不允许包含空样式规则
        "known-properties " : false    　　　 //不允许使用不识别的样式属性
      },
      build:['src/**/*.css']
    },
    //检查js代码规范  
    jshint: {   
      options: {  
        "bitwise": true,
        "browser": true,
        "curly": true,
        "eqeqeq": true,
        "esnext": true,
        "latedef": true,
        "noarg": true,
        "node": true,
        "strict": true,
        "undef": true,
        "unused": true,
        "globals": {
          "angular": false
        } 
      },
      build: ['Gruntfile.js', 'src/**/*.js']
    }, 
    // 通过watch任务，来监听文件是否有更改
    watch: {
      client: {
        // 我们不需要配置额外的任务，watch任务已经内建LiveReload浏览器刷新的代码片段。
        options: {
          livereload: lrPort
        },
        // '**' 表示包含所有的子目录
        // '*' 表示包含所有的文件
        files: ['src/**/*.html', 'src/**/*.css', 'src/**/*.js', 'src/**/images/*']
      }
    },
    //单元测试
    qunit: {
      all: ['src/**/*.html']
    },
    // 接口地址配置，开发与生产环境切换，只需在config文件夹下的js和json文件中配置环境变量值即可
    replace: {
        development: {  // 开发环境
            options: {
                patterns: [{
                    json: grunt.file.readJSON('./src/config/environments/dev.json')
                }]
            },
            files: [{
                expand: true,
                flatten: true,
                src: ['./src/config/config.js'],
                dest: './src/client/'
            }]
        },
        production: {   // 生产环境
            options: {
                patterns: [{
                    json: grunt.file.readJSON('./src/config/environments/prd.json')
                }]
            },
            files: [{
                expand: true,
                flatten: true,
                src: ['./src/config/config.js'],
                dest: './src/client/'
            }]
        }
    }
  });  
  
  grunt.loadNpmTasks('grunt-contrib-concat');  
  grunt.loadNpmTasks('grunt-contrib-cssmin');
  grunt.loadNpmTasks('grunt-contrib-uglify'); 
  grunt.loadNpmTasks('grunt-contrib-csslint'); 
  grunt.loadNpmTasks('grunt-contrib-jshint');  
  grunt.loadNpmTasks('grunt-contrib-watch');  
  grunt.loadNpmTasks('grunt-contrib-connect');  
  grunt.loadNpmTasks('grunt-contrib-qunit');
  
  grunt.registerTask('server', ['replace:development', 'connect', 'watch']);
  grunt.registerTask('lint', ['jshint','csslint']); //检查规则待配置
  grunt.registerTask('test', ['qunit']); //待配置
  grunt.registerTask('build', ['replace:production', 'concat','cssmin','uglify', 'connect', 'watch']); //会自动覆盖之前build的文件

};